package pe.edu.sistemas.postgrado.samupg.domain.model;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import static javax.persistence.GenerationType.IDENTITY;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

@Entity
@Table(name = "periodo", catalog = "bd_samupg")
public class Periodo implements java.io.Serializable {

    private Integer periodoId;
    private String nombre;
    private Date fechaApertura;
    private Date fechaCierre;
    private Boolean periodoActual;
    private List<FichaInscripcion> fichasInscripciones = new ArrayList<FichaInscripcion>(0);
    private List<MaestriaDiplomado> maestriaDiplomados = new ArrayList<MaestriaDiplomado>(0);
    private Examen examen;

    public Periodo() {
    }

    public Periodo(String nombre, Date fechaApertura, Date fechaCierre, Boolean periodoActual, List<FichaInscripcion> fichasInscripciones, Examen examen) {
        this.nombre = nombre;
        this.fechaApertura = fechaApertura;
        this.fechaCierre = fechaCierre;
        this.periodoActual = periodoActual;
        this.fichasInscripciones = fichasInscripciones;
        this.examen = examen;
    }

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "periodo_id", unique = true, nullable = false)
    public Integer getPeriodoId() {
        return this.periodoId;
    }

    public void setPeriodoId(Integer periodoId) {
        this.periodoId = periodoId;
    }

    @Column(name = "periodo_nombre", length = 45)
    public String getNombre() {
        return this.nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    @Temporal(TemporalType.DATE)
    @Column(name = "periodo_fecha_apertura", length = 10)
    public Date getFechaApertura() {
        return this.fechaApertura;
    }

    public void setFechaApertura(Date fechaApertura) {
        this.fechaApertura = fechaApertura;
    }

    @Temporal(TemporalType.DATE)
    @Column(name = "periodo_fecha_cierre", length = 10)
    public Date getFechaCierre() {
        return this.fechaCierre;
    }

    public void setFechaCierre(Date fechaCierre) {
        this.fechaCierre = fechaCierre;
    }

    @Column(name = "periodo_actual")
    public Boolean getPeriodoActual() {
        return this.periodoActual;
    }

    public void setPeriodoActual(Boolean periodoActual) {
        this.periodoActual = periodoActual;
    }

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "periodo")
    @Fetch(value = FetchMode.SUBSELECT)
    public List<FichaInscripcion> getFichasInscripciones() {
        return this.fichasInscripciones;
    }

    public void setFichasInscripciones(List<FichaInscripcion> fichasInscripciones) {
        this.fichasInscripciones = fichasInscripciones;
    }

    @OneToOne(fetch = FetchType.EAGER, mappedBy = "periodo")
    public Examen getExamen() {
        return this.examen;
    }

    public void setExamen(Examen examen) {
        this.examen = examen;
    }

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "periodo_md", catalog = "bd_samupg", joinColumns = {
        @JoinColumn(name = "periodo_periodo_id", referencedColumnName = "periodo_id", nullable = false, updatable = false)}, inverseJoinColumns = {
        @JoinColumn(name = "maestria_diplomado_md_id", referencedColumnName = "md_id", nullable = false, updatable = false)})
    @Fetch(value = FetchMode.SUBSELECT)
    public List<MaestriaDiplomado> getMaestriaDiplomados() {
        return maestriaDiplomados;
    }

    public void setMaestriaDiplomados(List<MaestriaDiplomado> maestriaDiplomados) {
        this.maestriaDiplomados = maestriaDiplomados;
    }
}
